package com.xuxu.routing;

import com.rabbitmq.client.*;
import com.xuxu.util.RabbitConnectionUtil;

import java.io.IOException;

/**
 * 路由模式，消费者。
 * 消费者中需要指定交换机、队列
 */
public class Consumer2 {
    //定义交换机名称，需要和生产者的交换机名称一致
    static final String DIRECT_EXCHANGE = "direct_exchange";
    //队列名称 1
    static final String DIRECT_QUEUE_2 = "direct_queue_2";

    public static void main(String[] args) throws Exception {
        //获取连接对象
        Connection connection = RabbitConnectionUtil.getConnection();
        //获取频道对象
        Channel channel = connection.createChannel();

        //声明交换机
        /*
            参数一：交换机名称
            参数二：指定模式是路由模式
         */
        channel.exchangeDeclare(DIRECT_EXCHANGE, BuiltinExchangeType.DIRECT);

        //声明队列
        /*
            参数一：队列名称
            参数二：是否持久化队列
            参数三：是否独占本次连接
            参数四：是否在不使用的时候删除队列
            参数五：队列其他参数
         */
        channel.queueDeclare(DIRECT_QUEUE_2,true,false,false,null);

        //队列绑定交换机
        /*
            参数一：队列名称
            参数二：交换机名称
            参数三：路由key
         */
        channel.queueBind(DIRECT_QUEUE_2,DIRECT_EXCHANGE,"delete"); //绑定路由key是 insert
        //channel.queueBind(DIRECT_QUEUE_2,DIRECT_EXCHANGE,"update"); //绑定路由key是 update

        System.out.println("---------------我是消费者2---------------");

        //创建消费者
        DefaultConsumer consumer = new DefaultConsumer(channel){
            /**
             * 重写消息处理的方法
             * @param consumerTag 消费者标签
             * @param envelope  信封，包含有 消息id、交换机、路由key、消息重传标志(消息接收失败是否重新发送消息)
             * @param properties 消息属性
             * @param body  消息体
             * @throws IOException
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                //获取消息id

                System.out.println("消息id是---------   "+envelope.getDeliveryTag());
                //获取交换机
                System.out.println("交换机是---------   "+envelope.getExchange());
                //获取路由key
                System.out.println("路由key是---------   "+envelope.getRoutingKey());
                //获取消息本体
                System.out.println("消息内容是---------   "+new String(body,"utf-8"));
            }
        };

        //监听消息
        /*
            参数一：队列名称
            参数二：是否自动确认收到消息，MQ收到确认动作会自动删除删除该条消息。设置成false需要手动确认
            参数三：消费者，回调
         */
        channel.basicConsume(DIRECT_QUEUE_2,true,consumer);

        //不用关闭资源，需要持续监听
    }
}
